package main

import (
	"fmt"
	"sync"
	"time"
)

/**
Mutex是最简单的一种锁，它提供了一种傻瓜式的操作，加锁解锁加锁解锁，让你不需要再考虑其他的
简单同时意味着某些特殊场景有可能会造成时间上的浪费，导致程序
*/
func main() {
	lock := &sync.RWMutex{}
	var wg sync.WaitGroup
	lock.Lock()
	wg.Add(4)
	for i := 0; i < 4; i++ {
		go func(i int) {
			defer wg.Done()
			fmt.Printf("第 %d 个协程准备开始...\n", i)
			lock.RLock()
			fmt.Printf("第 %d 个协程获得读锁，sleep 1s后，释放锁\n", i)
			time.Sleep(time.Second)
			lock.RUnlock()
		}(i)
	}
	lock.Unlock()
	wg.Wait()
	fmt.Println("准备释放写锁，读锁不在阻塞")

	lock.Lock()
	fmt.Println("程序退出...")
	lock.Unlock()
}
